package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 发电企业算法
 * Created by chen on 2021/12/4.
 */
public class ElectricityGenerationUtil {

    /**
     * 计算二氧化碳排放总量
     *
     * @param eBurn             化石燃料燃烧排放量
     * @param eDesulphurization 脱硫过程产生的二氧化碳排放量
     * @param eElectric         企业购入的电力消费的排放量
     * @param fc         AD煤
     * @return
     */
    public static Double getETotal(Double eBurn, Double eDesulphurization, Double eElectric, Double fc) {
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, eDesulphurization, eElectric, fc);
        return jsgc1.doubleValue();
    }

    /**
     * 计算 企业购入的电力消费的排放量
     *
     * @param ad 购入电量
     * @param ef 平均供电排放因子
     * @return
     */
    public static BigDecimal getEElectric(String ad, String ef) {
        BigDecimal cp_1B = new BigDecimal(ad);
        BigDecimal cp_2B = new BigDecimal(ef);
        return cp_1B.multiply(cp_2B);
    }

    /**
     * 计算 化石燃料燃烧排放量
     *
     * @param ncvis 第i种化石燃料的平均低位发热量，对固体和液体燃料以GJ/吨为单位，对气体燃料以GJ /万Nm 3 为单位
     * @param fcis  第i种化石燃料的净消耗量，对固体和液体燃料以吨为单位，对气体燃料以万Nm 3 为单位
     * @param ccis  第i种化石燃料的单位热值含碳量
     * @param ofis  第i种化石燃料的碳氧化率
     * @return
     */
    public static BigDecimal getEBurn(List<String> ncvis, List<String> fcis, List<String> ccis,
                                      List<String> ofis) {
        BigDecimal adi = getAdi(ncvis, fcis);
        BigDecimal efi = getEfi(ccis, ofis);
        return adi.multiply(efi);
    }

    /**
     * 计算化石燃料燃烧排放量
     *
     * @param ncvis 第i种化石燃料的平均低位发热量，对固体和液体燃料以GJ/吨为单位，对气体燃料以GJ /万Nm 3 为单位
     * @param fcis  第i种化石燃料的净消耗量，对固体和液体燃料以吨为单位，对气体燃料以万Nm 3 为单位
     * @return
     */
    public static BigDecimal getAdi(List<String> ncvis, List<String> fcis) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < ncvis.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(ncvis.get(i));
            BigDecimal cp_2B = new BigDecimal(fcis.get(i));
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            result = GasDCUtil.allAdd(result.doubleValue(), cp_3B.doubleValue());
        }
        return result;
    }

    /**
     * 计算第i种化石燃料的二氧化碳排放因子
     *
     * @param ccis 第i种化石燃料的单位热值含碳量
     * @param ofis 第i种化石燃料的碳氧化率
     * @return
     */
    public static BigDecimal getEfi(List<String> ccis, List<String> ofis) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        BigDecimal cl1B = new BigDecimal(44);
        BigDecimal cl2B = new BigDecimal(12);
        for (int i = 0; i < ccis.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(ccis.get(i));
            BigDecimal cp_2B = new BigDecimal(ofis.get(i));
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            BigDecimal cp_4B = cp_3B.multiply(cl1B);
            BigDecimal cp_5B = cp_4B.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP);
            result = GasDCUtil.allAdd(result.doubleValue(), cp_5B.doubleValue());
        }
        return result;
    }

    /**
     * 计算脱硫过程产生的二氧化碳排放量
     *
     * @param calks 第k种脱硫剂中的碳酸盐年消耗量
     * @param efks  第k种脱硫剂中碳酸盐的排放因子
     * @return
     */
    public static BigDecimal getActivityDataFossilFuels(List<String> calks, List<String> efks) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < calks.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(calks.get(i));
            BigDecimal cp_2B = new BigDecimal(efks.get(i));
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            result = GasDCUtil.allAdd(result.doubleValue(), cp_3B.doubleValue());
        }
        return result;
    }

    /**
     * 计算 燃煤月平均单位热值含碳量
     *
     * @param nvc 燃煤月平均低位发热量
     * @param c   燃煤月平均元素含碳量
     * @return
     */
    public static BigDecimal getCC(String nvc, String c) {
        BigDecimal cp_1B = new BigDecimal(nvc);
        BigDecimal cp_2B = new BigDecimal(c);
        return cp_2B.divide(cp_1B, 10, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算 燃煤的碳氧化率
     *
     * @param gResidue       全年的炉渣产量
     * @param cResidue       炉渣的平均含碳量
     * @param gAsh           全年的飞灰产量
     * @param cAsh           飞灰的平均含碳量
     * @param removeDust     除尘系统的平均除尘效率
     * @param monthlyHeatins 燃煤的消耗量
     * @param ncvs           燃煤的平均低位发热量
     * @param cs            燃煤单位热值的含碳量
     * @return
     */
    public static BigDecimal getOf(Double gResidue, Double cResidue, Double gAsh, Double cAsh, Double removeDust
            , List<String> monthlyHeatins, List<String> ncvs, List<String> cs) {
        BigDecimal cl1 = new BigDecimal(1);
        BigDecimal gResidueB = new BigDecimal(gResidue);
        BigDecimal cResidueB = new BigDecimal(cResidue);
        BigDecimal gAshB = new BigDecimal(gAsh);
        BigDecimal cAshB = new BigDecimal(cAsh);
        BigDecimal removeDustB = new BigDecimal(removeDust);
        BigDecimal jsgc1 = gResidueB.multiply(cResidueB);
        BigDecimal jsgc2 = gAshB.multiply(cAshB);
        BigDecimal jsgc3 = jsgc2.divide(removeDustB, 10, BigDecimal.ROUND_HALF_UP);
        BigDecimal jsgc4 = jsgc1.add(jsgc3);
        BigDecimal sumMonthlyHeatin = getSumMonthlyHeatin(monthlyHeatins);
        BigDecimal ncv = getSumNvc(ncvs, monthlyHeatins);
        List<String> ccs = getSumcc(ncvs, cs);
        BigDecimal cc = getSumNvc(ccs, monthlyHeatins);
        BigDecimal jsgc5 = sumMonthlyHeatin.multiply(ncv);
        BigDecimal jsgc6 = jsgc5.multiply(cc);
        BigDecimal jsgc7 = jsgc4.divide(jsgc6, 10, BigDecimal.ROUND_HALF_UP);
        return cl1.subtract(jsgc7);
    }

    public static List<String> getSumcc(List<String> ncvs, List<String> cs){
        List<String> ccs = new ArrayList<>();
        for (int i = 0; i < ncvs.size(); i++) {
            BigDecimal ncv = new BigDecimal(ncvs.get(i));
            BigDecimal c = new BigDecimal(cs.get(i));
            BigDecimal result = c.divide(ncv, 10, BigDecimal.ROUND_HALF_UP);
            ccs.add(result.toString());
        }
        return ccs;
    }

    /**
     * 月入炉总量之和
     *
     * @param monthlyHeatins
     * @return
     */
    public static BigDecimal getSumMonthlyHeatin(List<String> monthlyHeatins) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < monthlyHeatins.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(monthlyHeatins.get(i));
            result = GasDCUtil.allAdd(result.doubleValue(), cp_1B.doubleValue());
        }
        return result;
    }

    /**
     * 燃煤的平均低位发热量 或者 燃煤单位热值的含碳量
     *
     * @param params 要计算的值
     * @return
     */
    public static BigDecimal getSumNvc(List<String> params, List<String> monthlyHeatins) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < params.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(params.get(i));
            BigDecimal cp_2B = new BigDecimal(monthlyHeatins.get(i));
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            result = GasDCUtil.allAdd(result.doubleValue(), cp_3B.doubleValue());
        }
        BigDecimal sumMonthlyHeatin = getSumMonthlyHeatin(monthlyHeatins);
        result = result.divide(sumMonthlyHeatin, 10, BigDecimal.ROUND_HALF_UP);
        Double r = GasDCUtil.round(result.doubleValue(), 2);
        return new BigDecimal(r);
    }

    /**
     * 计算ad煤
     * @param cc
     * @param gResidue
     * @param cResidue
     * @param gAsh
     * @param cAsh
     * @param removeDust
     * @param monthlyHeatins
     * @param ncvs
     * @param cs
     * @return
     */
    public static BigDecimal getAd(BigDecimal cc, Double gResidue, Double cResidue, Double gAsh, Double cAsh, Double removeDust
            , List<String> monthlyHeatins, List<String> ncvs, List<String> cs){
        BigDecimal cl1 = new BigDecimal(44);
        BigDecimal cl2 = new BigDecimal(12);
        BigDecimal of = getOf(gResidue, cResidue, gAsh, cAsh, removeDust
                , monthlyHeatins, ncvs, cs);//14   0.125
        BigDecimal ad = getRecOrRep(monthlyHeatins, ncvs);//528070
        BigDecimal jsgc1 = cc.multiply(of);
        BigDecimal jsgc2 = jsgc1.multiply(cl1);
        BigDecimal jsgc3 = jsgc2.divide(cl2, 10, BigDecimal.ROUND_HALF_UP);//0.009
        BigDecimal result = jsgc3.multiply(ad);
        return result;
    }

    public static BigDecimal getRecOrRep(List<String> str1, List<String> str2){
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        BigDecimal b12 = new BigDecimal(12);
        for (int i = 0; i < str1.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(str1.get(i));
            BigDecimal cp_2B = new BigDecimal(str2.get(i));
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            result = GasDCUtil.allAdd(result.doubleValue(), cp_3B.doubleValue());
        }
        result = result.divide(b12, 10, BigDecimal.ROUND_HALF_UP);
        return result;
    }
}
